import axios from 'axios';

// import { getToken } from '../../auth';

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
axios.defaults.withCredentials = true   // 接口需要带cookie凭证或后端接口需要写入cookie(某些接口不接受cookie报了跨域，解决方案：后端接口改成接受cookie, 前端也可以不带cookie则需要单独配置为false)
const baseURL = `//fang.iplus.chanjue.top/apigw`;
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: `${baseURL}`,
  // baseURL: process.env.VUE_APP_BASE_API, // 本地代理用
  // 超时
  timeout: 50000
})

/**
 * 返回url+参数放放全局变量pending中
 */
 const getRequestIdentify = (config) => {
  // 返回url及请求参数 post方法请求参数为config.data  get方法请求参数为config.params
  if (config.method === 'post') {
    return config.data && Object.keys(config.data).length && config.url + '?' + paramsToString(config.data) || config.url
  }
  return config.params && Object.keys(config.params).length ? (config.url + ((config.url.includes('?') ? '&' : '?') + paramsToString(config.params))) : config.url
}
// 参数以a=1&b=2形式返加
function paramsToString(obj) {
  if (typeof obj != 'object' || !Object.keys(obj).length) return
  let str = []
  Object.keys(obj).forEach(key => {
    if (obj[key]) str.push(`${key}=${obj[key]}`)
  })
  return str.join('&');
}

// 拦截重复请求
var pending = [], cancel = null;
const CancelToken = axios.CancelToken
// 请求标识；完成请求后也需要执行删除key
const removePending = (conf, key, c) => {
   

  if (!conf.headers.isRepeat && pending.filter(item => item === key).length ) {
    // 取消请求
    c('取消重复请求')
  } else {
    // 收集请求
    pending.push(key)
  }
}

// request拦截器
service.interceptors.request.use(
  config => {
    // if (getToken()) {
    //   config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    // }
   
    if (config.headers.vite) {
      config.baseURL = ''
    }
    // 收集url+参数
    const requestData = getRequestIdentify(config)

    config.cancelToken = new CancelToken((c) => {
      removePending(config, requestData, c)
      cancel = c
    })

    // 全局添加时间戳以防有缓存
    if (config.method == 'post') {
      config.url += `${config.url.includes('?') ? '&' : '?'}_t=${Date.parse(new Date()) / 1000}`
    } else {
     if ( typeof config.params === 'string') {
      // config.params = {
      //   config.params,
      //   _t: Date.parse(new Date()) / 1000
      // }
     } else {
       config.params = {
         ...config.params,
         _t: Date.parse(new Date()) / 1000
       }
     }
    }
    // 请求之前允许重复的请求头移除
    if (config.headers.isRepeat) delete config.headers.isRepeat
    return config
  },
  error => {
    Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(res => {
  // 移除收集的url
  let currUrl = res.config.url.split('_t')[0]
  if (/\?|\&/.test(currUrl.slice(-1))) {
    currUrl = currUrl.slice(0, -1)
  }
  pending.forEach((item, index) => {
    if (~item.indexOf(currUrl)) {
      pending.splice(index, 1)
    }
  })
   
    let code = +res.data.code || 0
    if (code === 402) {
       console.log(res.data)
    } else if (code === 555) {
      console.log(res.data) 
    } else if (code === 403) {
      // 取消请求后面发出的所有请求
      cancel && cancel();
      console.log(res.data) 
    } else if (code !== 200 && code !== 0) {
       
      return res.data
    } else {
      return res.data
    }
  },
  error => {
    if(error.message==='取消重复请求') return {code: -1} // 代表重复请求由于一些.then里面的判断是!=0和==-1故返回-1
    // Message({
    //   message: error.message || error.msg,
    //   type: 'error',
    //   duration: 5 * 1000
    // })
    // 超时处理
    pending = []
    return Promise.reject(error)
  }
)

export default service
